class Sample(object):
    def __init__(self):
        print("__init__方法正在执行...初始化对象")

    def __enter__(self):  # 子类Sample重写父类object的__enter__方法
        print("__enter__方法正在执行...申请资源")
        return self

    def __exit__(self, type, value, trace):
        print("__exit__方法正在执行...释放资源")
        print("type", type)
        print("value", value)
        print("trace", trace)

    def do_something(self):
        print("do_something正在执行...操作资源")
        bar = 1 / 0  # 抛异常
        return bar + 10

# 方法调用顺序：init -- enter -- do_something -- exit,而enter和exit为with专有方法 

# with Sample() as sample:  # 在with块结束时，会自动调用__exit__方法来释放资源，无论是否发生异常。
#     sample.do_something()
Sample().do_something()  # 直接调用Sample().do_something()，则异常会被抛出到调用者处，需要调用者自行处理异常。
